/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tp01;

import tp01.utilitarios.ByteAndConversionsUtils;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author
 */
public class Funcion16RequestCommand extends RequestCommand {

    public final static int CANTIDAD_MAXIMA_DE_VARIABLES = 123;
    private int cantidadDeVariables;
    private byte[] valores;

    public Funcion16RequestCommand(int nroDispositivo, int direccion, int cantidadDeVariables, byte[] valores) {
        super(nroDispositivo, 16, direccion);
        this.cantidadDeVariables = cantidadDeVariables;
        this.valores = valores;
    }

    @Override
    public List<byte[]> armarPDU() {

        List<byte[]> result = new ArrayList<byte[]>();

        byte[] direccionBytes = ByteAndConversionsUtils.charToByteArray((char) getDireccion());

        byte[] cantVarBytes = ByteAndConversionsUtils.charToByteArray((char) cantidadDeVariables);


        byte[] pdu = {(byte) getNroFuncion(), direccionBytes[0], direccionBytes[1], cantVarBytes[0], cantVarBytes[1], (byte) (cantidadDeVariables * 2)};

        if (valores.length <= CANTIDAD_MAXIMA_DE_VARIABLES * 2) {
            result.add(ByteAndConversionsUtils.concatenarArrays(pdu, valores));
        } else {
            boolean hayMasTramas = true;

            byte[] temp;
            int tempSize = CANTIDAD_MAXIMA_DE_VARIABLES * 2;

            for (int i = 0; i < valores.length; i = i + CANTIDAD_MAXIMA_DE_VARIABLES * 2) {

                if (valores.length - i < cantidadDeVariables * 2) {
                    tempSize = valores.length - i;
                }

                temp = new byte[tempSize];

                System.arraycopy(valores, i, temp, 0, tempSize);

                direccionBytes = ByteAndConversionsUtils.charToByteArray((char) (getDireccion() + i / 2));

                cantVarBytes = ByteAndConversionsUtils.charToByteArray((char) (tempSize / 2));

                pdu[1] = direccionBytes[0];
                pdu[2] = direccionBytes[1];
                pdu[3] = cantVarBytes[0];
                pdu[4] = cantVarBytes[1];
                pdu[5] = (byte) tempSize;
                result.add(ByteAndConversionsUtils.concatenarArrays(pdu, temp));

            }

        }

        return result;

    }
}
